<?php
/**
 * > Smarty View インターフェース
 *
 * Smarty をレンダリングに使用するための、
 * 必要メソッドを定義します。
 *
 * @category   Zend_View_Abstract
 * @package    maple-story.jp
 * @version    8.0.0
 * @since      File available since Release 8.0.0
 * @copyright  Copyright 2011 Miracle Maple
 * @author     未来樹 / Mirage
 */
require_once SMARTY_CLASS;

class Plugin_View_Smarty extends Zend_View_Abstract
{
    /**
     * Smarty オブジェクト格納用
     */
    protected $_view;
    
    /**
     * コンストラクタ
     *
     * Smarty オブジェクトの初期化
     * @param    array    $option
     */
    public function __construct($option = array())
    {
        $this->_view = new Smarty();
        // デリミタの設定
        $this->_view->left_delimiter = '<!--{';
        $this->_view->right_delimiter = '}-->';
        // テンプレート内の PHP コードは処理しない
        $this->_view->php_handling = SMARTY_PHP_PASSTHRU;
        
        // 各種オプションを設定
        foreach ($option as $key => $value) {
            
            if ($key == 'plugins_dir') {
                $this->_view->plugins_dir[] = $value;
            } else {
                $this->_view->$key = $value;
            }
        }
    }
    
    /**
     * テンプレートファイルの基底フォルダ
     * @param    string    $path    基底パス
     * @param    string    $prefix  接頭辞
     */
    public function setBasePath($path, $prefix = 'Zend_View')
    {
        $this->_view->template_dir = $path . '/';
        $this->_view->cache_dir    = SMARTY_PATH . '/cache/';
        $this->_view->config_dir   = SMARTY_PATH . '/configs/';
        $this->_view->compile_dir  = SMARTY_PATH . '/templates_c/';
        $this->_view->plugins_dir[] = SMARTY_PATH . '/plugins/';
    }

    /**
     * テンプレートファイルの基底フォルダ追加
     * @param    string    $path    基底パス
     * @param    string    $prefix  接頭辞
     */
    public function addBasePath($path, $prefix = 'Zend_View')
    {
        $this->setBasePath($path, $prefix);
    }

    /**
     * テンプレートフォルダ取得
     * @return     array    テンプレートフォルダパス
     */
    public function getScriptPaths()
    {
        return array($this->_view->template_dir);
    }

    /**
     * テンプレートフォルダ設定
     * @param    string    $path    基底パス
     */
    public function setScriptPath($path)
    {
        $this->setBasePath($path);
    }

    /**
     * テンプレートフォルダ追加
     * @param    string    $path    基底パス
     */
    public function addScriptPath($path)
    {
        $this->setBasePath($path);
    }    

    /**
     * テンプレート変数取得（マジックメソッド）
     * @param    string    $key    変数名
     * @return   mixed     値
     */
    public function __get($key)
    {
        return $this->_view->get_template_vars($key);
    }

    /**
     * テンプレート変数を設定（マジックメソッド）
     * @param    string    $key    変数名
     * @param    mixed     $value  値
     */
    public function __set($key, $value)
    {
        $this->_view->assign($key, $value);
    }

    /**
     * テンプレート変数存在確認（マジックメソッド）
     * @param    string    $key    変数名
     * @return   boolean   値の存在
     */
    public function __isset($key)
    {
        return ($this->_view->get_template_vars($key) != NULL);
    }

    /**
     * テンプレート変数消去（マジックメソッド）
     * @param    string    $key    変数名
     */
    public function __unset($key)
    {
        $this->_view->clear_assign($key);
    }

    /**
     * テンプレート変数を設定（基本メソッド）
     * @param    string|array    $spec   変数名（または変数の連想配列）
     * @param    mixed           $value  値
     */
    public function assign($spec, $value = NULL)
    {
        if (is_array($spec)) {
            $this->_view->assign($spec);
        } else {
            $this->_view->assign($spec, $value);
        }
    }
    
    /**
     * テンプレート変数消去（基本メソッド）
     */
    public function clearVars()
    {
        $this->_view->clear_all_assign();
    }
    
    /**
     * ビュースクリプトのレンダリング
     * @param    string    $name    ファイル名
     */
    public function render($name)
    {
        $this->_view->assign('layout', Zend_Layout::getMvcInstance());
        $this->_view->assign('view', new Zend_View());
        return $this->_view->fetch($name);
    }
    
    /**
     * Smarty オブジェクトの取得
     * @return    Smarty    Smarty オブジェクト
     */
    public function getEngine()
    {
        return $this->_view;
    }

    /**
     * クローンオブジェクトの生成
     *
     * @return void
     */
    public function __clone()
    {
        if (isset($this->view) && $this->view instanceof Smarty) {
            $this->view = clone $this->view;

        }
    }

    /**
     * Includes the view script in a scope with only public $this variables.
     *
     * @param string The view script to execute.
     */
    protected function _run()
    {
		include func_get_arg(0);
    }
}